﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Persistence;
using Models.Models;
using Models;

namespace Services
{
    public class GerenciadorStatus
    {
             private IUnitOfWork unitOfWork;
        private bool shared;

        /// <summary>
        /// Construtor pode ser acessado externamente e não compartilha contexto
        /// </summary>
        public GerenciadorStatus()
        {
            this.unitOfWork = new UnitOfWork();
            shared = false;
        }

        /// <summary>
        /// Construtor acessado apenas dentro do componentes service e permite compartilhar
        /// contexto com outras classes de negócio
        /// </summary>
        /// <param name="unitOfWork"></param>
        internal GerenciadorStatus(IUnitOfWork unitOfWork)
        {
            this.unitOfWork = unitOfWork;
            shared = true;
        }

        /// <summary>
        /// Insere um novo na base de dados
        /// </summary>
        /// <param name="statusModel">Dados do modelo</param>
        /// <returns>Chave identificante na base</returns>
        public int Inserir(Status statusModel)
        {
            TB_STATUS statusE = new TB_STATUS();
            Atribuir(statusModel, statusE);
            unitOfWork.RepositorioStatus.Inserir(statusE);
            unitOfWork.Commit(shared);
            return statusE.id_Status;
        }

        /// <summary>
        /// Altera dados na base de dados
        /// </summary>
        /// <param name="statusModel"></param>
        public void Editar(Status statusModel)
        {
            TB_STATUS statusE = new TB_STATUS();
            Atribuir(statusModel, statusE);
            unitOfWork.RepositorioStatus.Editar(statusE);
            unitOfWork.Commit(shared);
        }

        /// <summary>
        /// Remove da base de dados
        /// </summary>
        /// <param name="statusModel"></param>
        public void Remover(int idStatus)
        {
            unitOfWork.RepositorioStatus.Remover(status => status.id_Status.Equals(idStatus));
            unitOfWork.Commit(shared);
        }


        /// <summary>
        /// Consulta padrão para retornar dados do status como model
        /// </summary>
        /// <returns></returns>
        private IQueryable<Status> GetQuery()
        {
            IQueryable<TB_STATUS> TB_STATUS = unitOfWork.RepositorioStatus.GetQueryable();
            var query = from status in TB_STATUS 
                        select new Status
                        {
                            Id_Status = status.id_Status,
                            Descricao = status.descricao,
                            St_Ativo = status.st_Ativo,


                        };
            return query;
        }

        /// <summary>
        /// Obter todos as entidades cadastradas
        /// </summary>
        /// <returns></returns>
        public IEnumerable<Status> ObterTodos()
        {
            return GetQuery();
        }

        /// <summary>
        /// Obtém um status
        /// </summary>
        /// <param name="idStatus">Identificador do status na base de dados</param>
        /// <returns>Status model</returns>
        public Status Obter(int idStatus)
        {
            IEnumerable<Status> status = GetQuery().Where(statusModel => statusModel.Id_Status.Equals(idStatus));
            return status.ElementAtOrDefault(0);
        }

        /// <summary>
        /// Atribui dados do Status Model para o Status Entity
        /// </summary>
        /// <param name="statusModel">Objeto do modelo</param>
        /// <param name="statusE">Entity mapeada da base de dados</param>
        private void Atribuir(Status StatusModel, TB_STATUS statusE)
        {
            statusE.id_Status = StatusModel.Id_Status;
            statusE.descricao = StatusModel.Descricao;
            statusE.st_Ativo  = StatusModel.St_Ativo;

        }
    }
}
